 package Ex1;

public class Ex07_OOP {

	public static void main(String[] args) {

		RetangleVO r = new RetangleVO(35, 45, "silver");
		float area = RetangleService.getArea(r.width, r.height);
		System.out.println(area);

		FanVO f = new FanVO(FanVO.Fast, true, 10, "yellow");
		// FanVO f = new FanVO(new FanVO().Fast,true,10,"yellow");
		// FanService.showFanInfo(f.speed,f.on,f.radius,f.color);
		System.out.println(FanService.showFanInfo(f));
	
		AccountVO a = new AccountVO(1122,20000,4.5F,"20131108");
		AccountService.withdraw(2500, a.balance);
		System.out.println(a.balance);
		//call by value - 값에 의한 전달
		//메소드 매개변수 유형이 기본자료형인 경우
		//기본 자료형 값을 메소드의 매개변수로 전달하면 JVM은 전달된 변수의 값은 메소드의 지역변수로 복사해줌
		//따라서 메소드의지역변수 값을 변경하더라도 전달해준 변수에는 영향을 미치지 않음
		AccountService.withdraw(2500, a);
		System.out.println(a.balance);
		//call by reference - 주소에 의한 전달
		//매소드 매개변수 유형이 참조 자료인 경우
		//만일 참조형 변수를 메소드의 매개변수로 전달하면 지역변수는 참조형 변수가 전달해 준 객체를 가리키게 됨
		//즉 참조형 변수에 저장된 값은 실제 값이 아니고 그 값을 가리키는 주소를 의미한다
		//따라서, 메소드에서 참조된 객체에 변경을 가하면 그 변화는 호출된 코드에도 반영됨
	}

}

class RetangleVO {
	float width;
	float height;
	String color;

	public RetangleVO() {
		width = 1.0F;
		height = 1.0F;
		color = "white";
	}

	public RetangleVO(float width, float height, String color) {
		this.width = width;
		this.height = height;
		this.color = color;
	}
}

class RetangleService {
	static float getArea(float width, float height) {
		return width * height;
	}

	static float getPerimter(float width, float height) {
		return (2 * width) + (2 * height);
	}
}

class FanVO {
	// 속도를 나타내는 상수들은 객체 생성 없이 바로 사용이 가능해야한다.
	// 따라서 static final 예약어를 사용한다.
	// 한편 JDK5 이상에서는 이것을 대체하기 위해 Enum이라는 새로운 클래스 자료형이 추가됨
	static final int Slow = 1;
	static final int Medium = 2;
	static final int Fast = 3;
	int speed = Slow;
	boolean on = false;
	float radius = 5.0F;
	String color = "blue";

	public FanVO() {
		speed = this.Slow;
		on = false;
		radius = 5.0F;
		color = "blue";
	}

	public FanVO(int speed, boolean on, float radius, String color) {
		this.speed = speed;
		this.on = on;
		this.radius = radius;
		this.color = color;

	}
}

class FanService {
	// 메소드 다중정의 overloading
	// 메소드 서명만 다르면 메소드 이름은 동일하게 작성가능
	/*
	 * static String showFanInfo(int speed, boolean on, float radius, String
	 * color){ String msg=""; if(on==true) msg =
	 * speed+","+color+","+radius+","+"꺼져있음"; else msg =
	 * speed+","radius+","+"꺼져있음";
	 * 
	 * return msg; }
	 */
	static String showFanInfo(FanVO f) {
		String msg = "";
		if (f.on == true)
			msg = f.speed + "," + f.color + "," + f.radius + "," + "꺼져있음";
		else
			msg = f.speed + "," + f.radius + "," + "꺼져있음";

		return msg;
	}
	
}

class AccountVO {

	int aid = 0;
	int balance = 0;
	float interestRate = 0;
	String dateCreated;
public AccountVO() {aid=0; balance=0; interestRate=0;}
public AccountVO(int aid,int balance,float interestRarte,String dateCreated) {
	this.aid=aid; this.balance=balance; this.interestRate=interestRarte; 
	this.dateCreated=dateCreated;
}
}
class AccountService{
	static float getMonthlyInterestRate(float interestRate) {
		return interestRate / 12;
	}
	static int withdraw( int gold ,int balance) { //call by value
		balance -= gold;
		return balance;
		
	}
		
	static int withdraw(int gold,AccountVO a) { //call by reference
		a.balance -= gold;
		return a.balance;
		
	}
	static int deposit( int gold,int balance ) {
		 balance += gold;
		 return balance;
	}
}

class StockVO {

	String sname;
	int previousCloosingPirce;
	int currentPrice;

}